создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
еще раз - лучше скачать handle counter и посмотреть его показания, сколько объектов создается при касте
стремление сделать все безутечно похвально, но все хорошо в меру
скрин скинул выше, но там ошибка. И если раскрыть, то обнаруживается еще одна утечка: на гуи Point(0,0), а на jass эта команда называется по-другому Location(0,0), эта функция создает точку
раскрыть
попробуй раскрутить, и использовать эту
native CreateItem takes integer itemid, real x, real y returns item
через CS: call CreateItem( id, GetUnitX(u), GetUnitY(u))
где id - ид-номер типа предмета, u - юнит. Ввести тип предмета, и юнита нужно.
можно еще запомнить как-то, чтобы к предмету как-то обращаться
через CS: set it = CreateItem( id, GetUnitX(u), GetUnitY(u))
где it - переменная предмета. Объявить переменную и обращаться
Сначала, Хоффман, думал обозвать тебя лентяем, но потом не удивился, почему ты ничего не нашел !!!
Близзарди засунули ети текстуры очень глубоко:
в архиве War3x.mpq есть архивы с названиями в виде букв английского алфавита, так вот твои заветние текстуры ето Cliff0.blp и Cliff1.blp в архиве Z.mpq.
Как вариант - попытаться в одной текстуре клиффов попробовать разместить сразу два визуальных решения.
Текстуры клиффов находятся в mpq архиве по адресу ReplaceableTextures\Cliff\
Текстура клиффов
A. рандумные поверхности клиффов
B. тайлинг прямых граней, верхушка клиффа
C. тайлинг прямых граней, низ клиффа
D. угловые тайлы, выбирается 1 рандумный
E. угловые тайлы, низ клиффа
F. применяютя у мостов и подъёмников
Каждому клиффсету принадлежит два файла:
Угловатые клифы ReplaceableTextures\Cliff\Cliff0.blp
Прямые клифы ReplaceableTextures\Cliff\Cliff1.blp
Вроде всё правильно написал, если не прав поправьте.
Это давно обсуждалось. вопрос удаление события
Создание триггер события — 3 утечки. Стереть переменный триггер, и минус 1. Получается остается 2 утечки.
Вот если удалить юнита (Remove unit), то он стирается из события другого триггера?
Урон настраивается через уровень способности, или как было сказано unit - damage target
команда для использования нестандартной способности берется от той способности, на основе которой ты её сделал, и если это цепь тралла - Unit - issue order with targetign a unit - orc - chain lighting
ПРИКАЗ сначало юнит Б получает атаковать цель А. Может стоять далеко от нее, поэтому бежит поближе к цели А.
АНИМАЦИЯ Потом начинает замахиваться, производить анимацию атаки. Короче событие юнит атакован помогает сказать, когда начнется анимация атаки. Надо понимать, что она не сейчас производится, а будет через секунду. За это время можно успеть отменить атаку, или сменить анимацию атаки.
УРОН Событие юнит получает урон показывает. что юнит получил еще урона, а получит урон. Можно сделать всякие хитрости со здоровьем и прочее. Еще нужно знать. что "юнит атакован" не равно "юнит получает урон". Потому что например, если запустить стрелу. то прилетит не сразу. да и промахнутся можно
Юнит получил приказ атаковать - реагирует на того, кто получил приказ. И того кого хотят атаковать.
Юнит атакован - реагирует на того. кого атаковали. И на того. кто является инициатором атаки.
Получает урон - реагирует на того кто получил урон. И кто нанес. Еще можно узнать сколько нанесли урона.
дубль 2
"Юнит атакован" не равно "Юнит получил приказ атаковать". По логике все верно, но должен получить приказ, затем подбежать поближе, а потом ударить или стрельнуть.
"Юнит атакован" срабатывает в тот момент, когда начинает делать анимацию атаки (замах, начинает натягивать лук и прочее. У кого что.). Короче событие срабатывает, но анимация происходит через 0.00 секунд.
Когда юнит проигрывает анимацию атаки (клинком проникает глубже в противника, из лука вылетает стрела и летит, снаряды из мортир летят к цели, и прочее). Можно отменить приказом (только вот не знаю у ренживиков выпущенные снаряды продолжают летать), проверяй до момента получения урона получал какой-нибудь другой приказ.
"Юнит получает урон" - фиксирует получение урона. А это фиксирует, что атака была успешна, только более поздняя фиксация
quq_CCCP, а если за монстра дали 8 голды?) А если расходы?
(Upkeep)
Помочь тебе может такая функция - Игрок - Player score - золота добыто.
Когда изменяется количество золота игрока - можно сравнивать предыдущее значение добытого золота и текущее. (К счастью для тебя этот пункт не считает награду за уничтожение)
Проверкой на неуязвимость есть 2 версии проверки, одна требует мемхак а друга нет.
Там проверка на то что дамми юнит сможет нанести урон юниту или нет, если не сможет - юнит неуязвим.
Я думаю захват делается не так, как у тебя - у тебя захват будет мгновенный
Там нужна целая переменная на прогресс захвата, и переменные для подсчета юнитов с обеих команд для того чтобы найти скорость захвата
Это происходит из-за per-vertex освещения. От подобных визуальных артефактов очень сложно избавиться, но можно немного замаскировать их, подкорректировав модели освещения (например, немного уменьшить интенсивность diffuse освещения и увеличить ambient):
В War3 Model Editor, в окне настроек материалов убрать метку "незатенённый" или "незатуманенный" (лучше обе, а то там вроде как они местами перепутаны).
Обойти можно взятием цели камеры в переменную в момент нажатия стрелки и с последующим восстановлением цели камеры в исходной точке.
Установить Point - Цель текущей камеры
Камера - передвинуть камеру к Point в течение 0 сек.
Можно орудовать стрелками в т.ч. если зажать кнопкой мыши на мордашке двигающегося юнита.
Карта пример с управлением прилагается.
Способ топорный, но может натолкнёт на что...
скачиваете JNGP, устанавливаете его, открываете редактор jngp. открываете или создаете карту и работаете. короче снимает лимит. Однако, если сохраните в jngp и попробуете открыть обычным редактором. возможно карта не откроется, так как карта вышла за пределами лимита
в футах это вызвано тем, что там 100500 юнитов одновременно у игрока, а в мили возможно из-за лагов.
т.е. триггерно такое не сделаешь, недочёт самого движка.
ИИ стандартный, полагаю? Стандартному ИИ вроде как вижн не важен, он и так знает где все находятся, если мне не изменяет память. Как от него не прячься, найдет сразу. Если уж очень хочется - давать юнитов нейтралам и делать их союзным всем ботам. (игроков 16, если не изменяет память). Или давать союзным игрокам, при наличии. По крайней мере не будут мчаться в след за армией. Однако вполне могут быть более качественные решения проблемы, я стандартный ИИ не изучал, не могу быть уверен в офигительности предложенного решения. :)
Делаешь несколько условий, например если я правильно понял то
Событие отряда - юнит заходит в область
Устанавливаем условие - входящий юнит типа - или любой входящий юнит (зависит от того что ты хочешь )
далее через действия - отряд - выбрать всех юнитов в данной области и сделать действие - передать другому игроку ( идеально подойдет нейтрально враждебные) и так же пишешь отряд - выбрать всех в данной области и приказать идти нападая на противников (если это нейтралы то они будут нападать на всех кроме нейтрально пассивных ) и так далее.
И то чтобы контроль вернулся есть два варианта
1.Если в определенной области то если юнит заходит в область сменить владельца и цвет так же через отряд
2.Ну или например делаешь еще один тригер с таймером, в 1 тригере ставишь создать таймер который зазвонит - через (твое время ) - далее во втором тригере используешь таймер истекает - отряд (лучше конечно тогда использовать переменные на отряде ) и выбрать всех юнитов в отряде - сменить владельца (Игрок(Целая А)) как то так.
Я знаю что это координаты умник.. пустые придирки не прокатят
я не только про координаты, я про всё
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
Если во всех картах одинаковый id, значит покопайся в хеше.
Это как, можно в личку?
Проблему решил, переделав стандартную способность, а не создавая нестандартную. Это почти что панацея от подобных случаев, когда id (ещё называют raw-code) способности меняется.
Не boolean а booexpr - это фильтр для группы, там никакие локалка не нужны.
Саму группу можно перебирать в цикле что правда дает шанс попасть в лимит операций и грохнуть поток.
Делать нужно примерно вот так :
function OnlyEnemyGroundAlive takes nothing returns boolean
return GetUnitState( GetFilterUnit(), UNIT_STATE_LIFE )> 0.405 and IsUnitEnemy( GetFilterUnit(), bj_groupEnumOwningPlayer ) and IsUnitType( GetFilterUnit(), UNIT_TYPE_GROUND )
endfunction
function DamageEnemy takes nothing returns nothing
call UnitDamageTarget( bj_lastReplacedUnit, GetEnumUnit(), 100.00, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS )
endfunction
function Temp takes nothing returns nothing
local group grp = CreateGroup( ) //создаём группу юнитов
local real dx = 0.00 // координата x
local real dy = 0.00 // координата y
set bj_groupEnumOwningPlayer == Player(0) // глобальная переменная чтобы передать данные в фильтр
call GroupEnumUnitsInRange( grp, dx, dy, 512.00, Condition( function OnlyEnemyGroundAlive) )
set bj_lastReplacedUnit = GetTriggerUnit( )// глобальная переменная чтобы передать данные в другую функцию.
call ForGroup( grp, function DamageEnemy )
call DestroyGroup( grp )
set grp = null
endfunction
у тебя есть несколько проблем:
1)у тебя точка не удаляется и зависает в памяти что даёт утечки(лаги)
2)у тебя не устанавливается группа что даёт утечки(лаги) + нельзя отследить людей в ней
3)у тебя создаётся спецэффект, но не удаляется что даёт утечки(лаги)
Нужно создать переменную типа Отряд(то есть группа):
назвать её допустим GROUP
Нужно создать переменную типа Боевая единица:
назвать её допустим UNIT
нужно сделать так:
в триггере где событие ПРИМЕНЯЕТ СПОСОБНОСТЬ создать действие:
установить применяющий юнит = UNIT
установить FireStrike = случ точка в области Fire strike
установить группу GROUP = юниты в области 300 от Fire strike соответствующий юнит не равно UNIT
создать эффект
удалить эффект
call RemoveLocation(udg_FireStrike)
call DestroyGroup(udg_GROUP)
Bornikkeny, сделал специально чтобы доказать тебе что ты несёшь бред
даже 2 скрина приложил
думаю закинуть библиотеки сможешь сам (в папку *твой jngp*\AdicHelper\lib)
Хорошо группы реализуешь как альтернативу unit[array]. Я тоже самое получил. nvc123, и всё же твой хук не тот что мне нужен.
Я решил проблему, спасибо что дал идею обрабатывать движение внутри структуры, а не в стеке.
кот
library Hook initializer Init_Hook uses LibMath
globals
mhook ahook[100]
integer ihook = -1
endglobals
struct mhook
unit host = null
unit target = null
real face = 0
real speed = 0
real dis = 0
real dismax = 0
integer chaini = 0
unit chain[50]
real scale = 0
integer move = 1
integer i = 0
static method Create takes unit host, real tx, real ty, real scale returns mhook
local mhook h = mhook.create()
local integer i = GetPlayerId(GetOwningPlayer(host))
local real x = GetUnitX(host)
local real y = GetUnitY(host)
local real f = GetAngleXY(x,y,tx,ty)
set h.host = host
set h.face = f
set h.speed = 600
set h.dismax = 1400
set h.scale = scale
set h.chain[0] = CreateUnit(Player(i),'h007',GetPolarX(GetUnitX(host),f,h.scale/2),GetPolarY(GetUnitY(host),f,h.scale/2),f)
set h.i = i
call UnitAddAbility(h.chain[0],'Amrf')
call UnitAddAbility(h.chain[0],'Amrf')
call SetUnitFlyHeight(h.chain[0],50,0)
call SetUnitPathing(h.chain[0],false)
return h
endmethod
method Start takes nothing returns boolean
if ihook < 1000 then
set ihook = ihook + 1
set ahook[ihook] = this
return true
else
return false
endif
endmethod
method Destroy takes nothing returns nothing
local integer i = 0
loop
exitwhen i > ihook
if ahook[i] == this then
set ahook[i] = ahook[ihook]
set ahook[ihook] = 0
set ihook = ihook - 1
set i = ihook // выход из цикла
endif
set i = i + 1
endloop
set this.target = null
set this.host = null
call this.destroy()
endmethod
method Move takes nothing returns nothing
local integer i1 = 0
local integer l = 0
local real x
local real y
local real xh
local real yh
local real f
if move == 1
set dis = dis + speed*0.025
loop
exitwhen i1 > .chaini
set x = GetUnitX(.chain[i1])
set y = GetUnitY(.chain[i1])
if i1 > 0 then
set f = GetAngleXY(x,y,GetUnitX(.chain[i1-1]),GetUnitY(.chain[i1-1]))
call SetUnitX(.chain[i1],GetPolarX(x,f,.speed*0.025))
call SetUnitY(.chain[i1],GetPolarY(y,f,.speed*0.025))
else
set f = face
call SetUnitX(chain[i1],GetPolarX(x,f,.speed*0.025))
call SetUnitY(chain[i1],GetPolarY(y,f,.speed*0.025))
endif
call SetUnitFacing(chain[i1],f)
set i1 = i1 + 1
endloop
set x = GetUnitX(chain[chaini])
set y = GetUnitY(chain[chaini])
set f = GetAngleXY(GetUnitX(.host),GetUnitY(.host),x,y)
set xh = GetPolarX(GetUnitX(.host),f,.scale/2)
set yh = GetPolarY(GetUnitY(.host),f,.scale/2)
//Create==================
if GetDisXY(xh,yh,x,y) >= .scale/2 then
set chaini = chaini + 1
set chain[chaini] = CreateUnit(Player(.i),'h007',xh,yh,f)
call UnitAddAbility(.chain[.chaini],'Amrf')
call UnitAddAbility(.chain[.chaini],'Amrf')
call SetUnitFlyHeight(.chain[.chaini],50,0)
endif
if dis > dismax then
set move = 0
endif
else
//REVERSE=============
set xh = GetUnitX(host)
set yh = GetUnitY(host)
set chain[chaini+1] = host
loop
exitwhen l > chaini
set x = GetUnitX(chain[l])
set y = GetUnitY(chain[l])
//if chain[chaini] == null then
// set f = GetAngleXY()
//endif
set f = GetAngleXY(x,y,GetUnitX(chain[l+1]),GetUnitY(chain[l+1]))
call SetUnitX(chain[l],GetPolarX(x,f,speed*0.025))
call SetUnitY(chain[l],GetPolarY(y,f,speed*0.025))
call SetUnitFacing(chain[l],f-180)
set l = l + 1
endloop
//Destroy==================
set x = GetUnitX(chain[chaini])
set y = GetUnitY(chain[chaini])
set xh = GetUnitX(host)
set yh = GetUnitY(host)
if GetDisXY(GetUnitX(chain[chaini]),GetUnitY(chain[chaini]),GetUnitX(host),GetUnitY(host)) < 100 then
call RemoveUnit(chain[chaini])
set chain[chaini] = null
set chaini = chaini - 1
if chaini == -1 then
call .Destroy()
endif
endif
endif
endmethod
endstruct
private function Engine takes nothing returns nothing
local integer i = 0
local mhook h
local group g
local unit t
loop
exitwhen i > ihook
if ahook[i] != 0 then
set h = ahook[i]
//--run--//
call h.Move()
else
set ahook[i] = ahook[ihook]
set ahook[ihook] = 0
set ihook = ihook - 1
set i = i - 1
endif
set i = i + 1
endloop
//call DestroyGroup(g)
set g = null
set t = null
endfunction
function Trig_HookC_Bool takes nothing returns boolean
if GetSpellAbilityId() == 'A01D' then //Способность Мясной хук
return true
else
return false
endif
endfunction
function Trig_HookC_Actions takes nothing returns nothing
local mhook h
set h = mhook.Create(GetSpellAbilityUnit(),GetSpellTargetX(),GetSpellTargetY(),110)
call h.Start()
endfunction
function Init_Hook takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( t, function Trig_HookC_Actions )
call TriggerAddCondition(t,function Trig_HookC_Bool)
call TimerStart(CreateTimer(),0.025,true,function Engine)
endfunction
endlibrary
Здесь не делают заказы. Насколько помню есть специальные темы для заказов. Но совершенно случайно у меня оказалась пара свободных минут
Импортировать TerrainArt\Ruins\*.blp
Вот. Есть текст про описание движения как я понял (вот в чем разница между конным и пешим пока тоже не понял, интересует вот, что дает конный)
Эти паффинги, и типы движения взаимосвязаны. У некоторых есть баги, которыми можно воспользоваться. Например, чтобы летающие юниты игнорили ландшафт и летели прямо (вот на клифах может быть криво). На форуме дофига такого. Также можно сделать нелетающих летающими, дать сфинкс или превратиться в ворона (тоже баг) Ну и так далее
Tiodor, стоп, как это по тем же точкам? При изменении положения базовой кости, разве присоединённые к ней остальные не должны меняться? В-общем не могу я исправить)) Эта модель должна заменять архивную... К какой-либо карте она не относится. Так-то =(
После усердного копания архивов игры и парочки тестов, нашёл для себя выход) В War3Patch.mpq/Units/UnitUI.slk хранились нужные мне данные. Ранее подобных проблем не было (о почему же!), поэтому и не пытался издеваться над игрой)
А с каким юнитом проблема? И в каком триггере ты регулируешь масштаб? А то лень копаться в РО и РТ
К примеру, юнит "Атрозис 2" меньше юнита "Атрозис 1", хотя в РО размер задан больше, модель стандартная. Через триггеры масштаб не регулируется. Возможно, проблема с триггерами в папке "bu", которые отвечают за мгновенное строительство и улучшение.
Всем спасибо, проблему распаковал. Проблема была действительно в триггерах, которые мгновенно достраивают здания. При улучшении, здания как бы "начинают расти", но триггер делает прогресс улучшения равным 100% и масштаб остается прежним.
Obelick, эта либо не трогает мультибоарды
она по точкам(location) в основном работает Obelick:
учить ради них джас и переписывать мне настолько лень
если ты нормально знаешь гуи и имеешь базовые знания по использованию гугл переводчика то переписать мультибоард на jass много времени не займёт
кроме того тебе не обязательно переписывать полностью
можно сконвертировать в код и поправить то что вызывает утечки
если ты говоришь об утечках в функции установки значения ячейки мультибоарда то их можно убрать следующим кодом
вставь его в шапку карты (туда где ты ALL.j подключал)
правда после этого автозаполнение строк/столбцов перестанет работать и придётся делать его циклом
Zeuz, в доте нету такого количества таймеров
во многих нормальных картах сделано так как в статьях Zeuz:
покажи пример в обычном jass
скопируй в карту а потом вытащи из неё j файл или напиши в коде букву на отдельной строке (тогда тебе выдаст ошибку и будет показан исходный код)
но на обычном джассе этот код больше и писать/читать его неудобно так что держи
Насчет дестроя группы. Она же создается один раз, если я ее уничтожу - триггер вообще выполнятся не станет, разве не так?
Это не так, она уже использовалась и стала локальной, и да. Лучше глобальную используй.
Лучше внутри таймера проверять ограниченным кол-во крипов через стек. т.е. о 0 до N ограничения, которые не повлияет на производительность. при этом проверяя на наличие их безжизненности, потом просто воссоздавая их по данным сохранённым внутри данных по юниту.
Если мобы были ранее на карте, то и ранее должны были быть зарегестрированы в массив данных, где храниться их TypeId, PosX\Y и п.р.
во первых где дебаг
во вторых не фиг вешать на хэндл таймера всякую фигню
юзай список и пробегай по нему таймером
и будет тебе счастье
в третьих если говоришь что где то ошибка ты должен указать :
строку с ошибкой
доказательства того что она произошла (скрин + лог)
собственные попытки её исправить
в четвёртых предоставить карту
короче либо предоставь всю информацию либо перепиши код по нормальному
как правильно переписать ты сможешь прочесть в статьях
native IssueImmediateOrderById takes unit whichUnit, integer order returns boolean
Создай юнитов по 1 на каждого игрока и прикажи им
call IssueImmediateOrderById(<твой юнит>, 852164)
приказ можно менять только Каналу и книге заклинаний, у остальных способностей нет смысла
Возможно порядок вызова отрабатывает не правильно. Я бы сделал немного иначе. Внутри фигуры запрашивал бы данные от кубов.
var cubeComponents = GetChildrenComponents<CubComponent>(); // получаем список дочерних компонентов типа CubeComponent
var isRightCollision = cubeComponents.Any(cube => cube.isRight); // проверяем у каждого флаг isRight и если хотя бы у одного стоит, то возврашаем true
// .. остальные действия
» WarCraft 3 / Отмена приказа предмета
» WarCraft 3 / war3mapImported
» WarCraft 3 / Утечки
» WarCraft 3 / Текстура склона
» WarCraft 3 / Событие на получение урона
» WarCraft 3 / нужна модель
» WarCraft 3 / Как отследить?
» WarCraft 3 / Проблема с освещением
» WarCraft 3 / Горячая клавиша предмету
» WarCraft 3 / Камера
» WarCraft 3 / Ограничение на количество войск
» WarCraft 3 / Контроль юнитов врага
» WarCraft 3 / Ошибка в коде?
» WarCraft 3 / Проблема со способностью
» WarCraft 3 / Пути
» WarCraft 3 / Масштабирование модели
» WarCraft 3 / Библиотека звуков
» WarCraft 3 / call ForGroup()
» Unity / Скрипт